package com.joe.network.utils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.alibaba.fastjson.serializer.SerializerFeature;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @author ckh
 * @since 2020/11/25 4:53 PM
 */
@SuppressWarnings("AlibabaClassNamingShouldBeCamel")
public class JSONUtils<T> {
    /**
     * 将String 转化为 json对象
     *
     * @param json json字符串
     */
    public static JSONObject parseObject(String json) {
        return JSON.parseObject(json);
    }

    /**
     * 将JSON字符串转化为JAVA BEAN
     *
     * @param json  JSON字符串
     * @param clazz JAVA BEAN 类型
     */
    public static <T> T parseObject(String json, Class<T> clazz) {
        return (T) JSON.parseObject(json, clazz);
    }

    /**
     * 将JSON字符串转化为JSON数组
     *
     * @param json JSON字符串
     */
    public static JSONArray parseArray(String json) {
        return JSON.parseArray(json);
    }

    /**
     * 将JSON字符串转为JAVA 集合
     *
     * @param json  JSON字符串
     * @param clazz 集合中BEAN类型
     */
    public static <T> List<T> parseArray(String json, Class<T> clazz) {
        return JSON.parseArray(json, clazz);
    }

    /**
     * 将JSON 对象转化 为JSON 字符串
     *
     * @param object JSON 对象
     */
    public static String toJSONString(Object object) {
        return JSON.toJSONString(object);
    }


    /**
     * 将JSON字符串转化为MAP对象
     *
     * @param json JSON字符串
     */
    public static Map<String, Object> convertJsonToMap(String json) {

        return JSON.parseObject(json, new TypeReference<Map<String, Object>>() {
        });
    }

    /**
     * 将JAVA对象转化为JSON字符串以及特定的时间格式
     *
     * @param object     JAVA 对象
     * @param dataFormat 日期格式
     */
    public static String toJSONString(Object object, String dataFormat) {
        return JSON.toJSONStringWithDateFormat(object, dataFormat, SerializerFeature.WriteDateUseDateFormat);
    }

    /**
     * json数组转List
     */
    public List<T> jsonToList(String search, T t) {
        List<T> resultList = new ArrayList<>();
        List<Map<String, String>> listObjectFir = (List<Map<String, String>>) JSONArray.parse(search);
        for (Map<String, String> mapList : listObjectFir) {
            Field[] fields = t.getClass().getFields();
            for (Field field : fields) {
                if (mapList.get(field.getName()) != null) {
                    StringBuilder setMethod = new StringBuilder().append("set").append(field.getName().substring(0, 1).toUpperCase()).append(field.getName().substring(1));
                    try {
                        t.getClass().getMethod(setMethod.toString()).invoke(t);
                    } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
                        e.printStackTrace();
                    }
                }
            }
            resultList.add(t);
        }
        return resultList;
    }
}
